home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
376-400
/
376
/
plotter
/
plotter.doc
< prev
next >
Wrap
Text File
|
1995-03-14
|
13KB
|
229 lines
Plotter V3.71
© by Rüdiger Dreier 1988/9/90
Plotter ist FREEWARE
DER AUTOR ÜBERNIMMT KEINERLEI HAFTUNG FÜR SCHÄDEN, DIE AUS DER SACH- ODER
UNSACHGEMÄSSEN BENUTZUNG DES PROGRAMMS ENTSTEHEN !!
WEITERHIN WIRD KEINE HAFTUNG FÜR DIE FEHLERFREIHEIT DES PROGRAMMS
ÜBERNOMMEN !!
BENUTZUNG AUF EIGENE GEFAHR !
Der Plotter ist ein Programm zum zeichnen zweidimensionaler mathe-
matischer Funktionen. Es können 10 Funktionen eingegeben und gezeichnet
werden. Zusätzlich kann man sich von jeder Funktion die erste und zweite
Ableitung zeichnen lassen (jeweils nummerisch oder symbolisch bestimmt).
Es eignet sich zur Unterstützung bei Kurvendiskussionen, um die selbst
errechneten Ergebnisse zu kontrollieren. Das Programm fertigt keine
komplette Kurvendiskussion an.
Anforderungen an die Rechnerkonfiguration:
Das Programm läuft unter Kickstart 1.2 und 1.3, 512kB Speicher sollten
mindestens vorhanden sein, besser mehr. Der Stack sollte mindestens 20000
Bytes betragen, sonst kommt es zu leicht zu Abstürzen. Im logischen
Device LIBS: müssen sich drei Libraries befinden:
- mathieeedoubbas.library
- mathieeedoubtrans.library
- tool.library (in diesem Ordner enthalten)
Die Menupunkte:
C-Plot
Genauigkeit
Es erscheinen 3 SubMenuPunkte, mit denen die Genauigkeit auf klein,
mittel oder groß gesetzt werden kann. Je genauer gezeichnet wird, desto
mehr Zeit wird benötigt.
Intervall
Nach Anwahl dieses Menupunktes erscheint ein Fenster mit 4
Stringgadgets, in denen die alten Intervallgrenzen (der Bereich, für
den die Funktion gezeichnet werden soll) anzeigt werden. Diese Werte
kann man wie gewohnt verändern. Der eingegebene Term muß nur den
Anforderungen entsprechen, die auch für die Funktionen gelten. Außerdem
darf die linke/untere Grenze nicht größer/gleich sein als die
rechte/obere. In solchen Fällen erscheint das Fenster nach Anwahl des
OK-Gadget (oder <RETURN> im vierten Stringgadget) wieder.
Löschen
Die auf dem Bildschirm dargestellten Funktionen und das
Koordinatenkreuz werden gelöscht. Geschieht automatisch beim Verändern
der Intervallgrenzen und Auflösung.
Drucken
Der für die Darstellung auf dem Bildschirm benutzte Rastport wird
auf dem Drucker so groß wie möglich ausgegeben.
Bereich mit Maus auswählen
Dieser Menupunkt stellt eine Art Lupenfunktion zur Verfügung. Das
Intervall, das als nächstes gezeichnet werden soll, kann mit der Maus
ausgewählt werden. Die obere/linke Ecke wird mit der Maus angefahren,
die linke Maustaste gedrückt und gehalten und dann die rechte/untere
Ecke ausgewählt und die Maustaste losgelassen. Danach wird der
Bildschirm gelöscht. Während die Maustaste gedrückt wird, wird um den
momentan ausgewählten Bereich ein Kasten gezeichnet. Wurde die größte
Darstellungsart (s.u.)ausgewählt, so kann jederzeit mit den
Cursurtasten und ESC in der gesammten Darstellung gescrollt
werden.
Konstanten
Ein Fenster ähnlich dem bei INTERVALL erscheint. In diesem kann man
vier Konstanten (a,b,c,d) bestimmen, die bei Intervall und innerhalb
der Funktionen benutzt werden können.
About
Dieser Menupunkt zeigt die Versionsnummer und das Datum der letzten
Veränderung an dem Programm an. Durch Anklicken des Fensters
verschwindet es wieder.
ENDE
Das Programm wird beendet (mit Sicherheitsabfrage).
Funktion
Ändern
Nach Anwahl dieses Menupunktes erscheint ein Untermenu mit den bisher
eingegebenen Funktionen (es werden die ersten 14 Zeichen der Funktion
angezeigt). Wird einer dieser Funktionen angewählt, so erscheint sie in
einem Stringgadget, so daß sie verändert werden kann. Die Funktion muß
mathematisch korrekt eingegeben werden. Jede Funktion darf aus den
Rechenarten +,-,*,/,^ und den Funktionen sin, cos, tan, log, int, sgn,
abs, sqr, asin, acos, atan, ln und den Konstanten a, b, c, d, e und pi
sowie der Variablen x bestehen. Es muß alles klein geschrieben werden.
Zahlen dürfen normal (1; 1.1; .1) oder in Potenzschreibweise (3e5,5d-7)
eingegeben werden. Bei Potenzen darf vor dem Exponenten ein + oder -
stehen, ohne das der Exponent gleich geklammert werden muß. In der
Regel sollte man aber alles so klammern, daß zweifelsfrei festgelegt
ist, in welcher Reihenfolge der Term berechnet werden soll. Es gilt
natürlich Potenz- vor Punkt-vor Strichrechnung. Wenn unpaarige Klammern
vorhanden sind, erscheint das Stringgadget gleich wieder, damit man die
Funktion korrigieren kann.
Funktion, 1./2. Ableitung num/symb:
Bei jedem dieser 5 Menupunkte erscheint wieder das Untermenu. Durch
Anwahl eines Untermenupunktes kann man dann bestimmen, welche Funktion
man gezeichnet haben will. Numerische Ableitungen werden nach dem
Sekantenverfahren bestimmt, dabei können schon in der ersten Ableitung
Ungenauigkeiten auftreten, die in der zweiten Ableitung dann schon
recht deutlich werden. Beim symbolischen Ableiten wird erst die
Ableitung als Term bestimmt und dann normal gezeichnet. Dabei kommt es
dann nach Anwahl der Funktion zu einer kurzen Verzögerung, in der die
Ableitung bestimmt wird. Diese Methode ist genauer, hat aber auch ihre
Nachteile: Funktionsterme dürfen höchstens 500 Zeichen lang sein, bei
komplizierten Funktionen kann diese Grenze bei der zweiten Ableitung
leicht überschritten werden. Daher sollte der Programmteil Ableitung.c
immer mit Stack-Checking compiliert werden (Lattice-C: ohne -v). Damit
kann man einige Abstürze umgehen. Tritt bei dieser Version Plotter
(ohne -v compiliert) ein Stacküberlauf auf, so erscheint ein Auto-
requester, der einen darauf aufmerksam macht und die Möglichkeit zum
Abbruch des Programms gibt. Dabei wird der Screen des Programms nicht
geschlossen, dieser Speicher geht also verloren (leider). Aber immerhin
ist der Rechner nicht aus heiterem Himmel abgestürzt.
Außerdem sind einige der oben erwähnten Funktionen nicht ohne weiteres
abzuleiten. Die Ableitung von sgn ist z.B. fast überall Null, nur um
Null herum ist sie nicht definiert. Das Programm setzt dafür aber
einfach Null ein. Außerdem wird z.B. die Ableitung von ln zu 1/x
bestimmt und auch so gezeichnet, d.h. auch im negativen Bereich
gezeichnet, obwohl ln dort überhaupt nicht definiert ist.
Stellt das Programm beim Zeichnen einen mathematischen Fehler fest
(z.B. Wurzel aus einer negativen Zahl), so erscheint nach dem Zeichnen
ein Requester, der einen auf einen Fehler in der Formel aufmerksam
macht. Dieser Fehler kann natürlich auch am Intervall liegen (oder bei
1/x wurde eine Division durch Null erkannt). Meistens kann man diese
Meldung ignorieren, besonder wenn man sie schon erwartet hat. Sie
erscheint hauptsächlich, um einen zu zeigen, daß beim Zeichnen etwas
geschummelt wurde.
Jeder Zeichenvorgang kann durch einen Mausklick in die Zeichenfläche
abgebrochen werden. Es erscheint dann ein Requester, in dem man wählen
kann, ob weitergezeichnet oder abgebrochen werden soll.
Diskussion
Unter diesem Menupunkt kann man sich eine grobe Kurvendiskussion er-
stellen lassen (Nullstellen, Wendestellen und Extremstellen). Diese
Stellen werden nur für das eingegebene Intervall bestimmt. Außerdem
wird die Funktion sowie die erste und zweite Ableitung angezeigt. Bei
Extremstellen wird angegeben, ob es ein Minimum oder Maximum ist, bei
Wendestellen, ob es eine rechts-links "Kurve" oder umgekehrt ist.
Nochmal zu den symbolischen Ableitungen: Eingefleischten Mathematikern
mag bei einigen der Ableitungen die Haare zu Berge stehen. Zum Einen
ist es mit der Vereinfachung der Terme noch nicht sehr weit her
(Immerhin: 0*irgendetwas wird nicht angezeigt, wohl aber
(1-1)*irgendetwas....).
Aber auch rein mathematisch wird manchmal geschummelt. Folgende
Ableitungen werden eingesetzt:
+-*/ : Das übliche
x^a : a*x^(a-1)
a^x : a^x*ln(a)
f(x)^g(x) : (g(x)*ln(f(x)))'*f(x)^g(x)
(Weiß jemand etwas besseres oder einfacheres ?)
trigonometr. Funktionen : Das übliche
abs(x) : sgn(x) (Für x=0 nicht richtig)
int(x) : 0 (Läßt sich drüber diskutieren)
sgn(x) : 0 (Läßt sich drüber diskutieren)
Das Programm macht nicht deutlich, wenn eine nicht ganz korrekte
Ableitung benutzt wird. Im Zweifelsfall die nummerisch bestimmte
Ableitung mit der symbolisch bestimmten vergleichen, sie sollten
identisch sein. (Ausnahme: z.B. bei ln(x), siehe oben).
ICH ÜBERNEHME KEINERLEI VERANTWORTUNG FÜR DIE RICHTIGKEIT DER
ABLEITUNGEN ODER ANDERER ERGEBNISSE DIESES PROGRAMMS !! WER EIN
ERGEBNIS IN EINER DIPLOMARBEIT ODER ÄHNLICHEN VERWENDET, SOLLTE LIEBER
NOCHMAL VON HAND NACHRECHNEN !!!!
Zu einer vollständigen Kurvendiskussion fehlt noch einiges: z.B.
- Angabe Definitionsbereich
- Symetrie
- Asymptoten etc.
(vielleicht später mal).
Größe
In diesen Menu kann man einstellen, ob auf einer 640x256- oder 1000 x
300-Bitplane gezeichnet werden soll. Da die größere Möglichkeit nicht
in ein Fenster paßt, kann man mit den Cursor-Tasten in der Bitplan
herumscrollen. Mit ESC kommt man in die obere/linke Ecke zurück. Die
große Auflösung eignet sich besonders gut für Ausdrucke, aber man
sollte dann einen Drucker haben, der auch so viele Punkte je Zeile
darstellen kann.
Hinweis
-------
Um den Code klein zu halten, wurde eine Stub-Routine MemCleanup
eingefügt. Das verringert die Codelänge bei Lattice-Programmen meist
etwas. Bei anderen Compilern sollten die entsprechenden Zeilen gelöscht
werden (in Berechnungsroutinen.c). Für Lattice-Besitzer: das C-Tutorial
auf Disk 4 beachten (V4.00).
Bekannte Fehler:
----------------
Es wäre schön, wenn ich hier KEINE hinschreiben (tippen) könnte. Aber das
wäre nicht ganz richtig. Es gibt ein paar kleine Fehler, ich weiß aber
nicht, wo sie sind.
- Im Quelltext muß Mathieeebase als extern deklariert werden, sonst
beschwert sich der Linker. Bei allen anderen Library-Pointern kann man
einmal normal deklarieren. Dieser Fehler liegt wohl irgendwo in den
(Link)Libraries.
- Gelegentlich wird beim Zeichnen ein Funktionswert zu NULL bestimmt und
entsprechend gezeichnet. Das ergibt dann einen einzelnen Punkt oder einen
häßlichen Haken. Dieser Fehler ist nicht reproduzierbar, d.h. läßt man
die gleiche Funktion sofort nochmal zeichnen, passiert das gleiche nicht
nochmal. Wie kann sowas passieren ?
- Gelegentlich tritt eine TrapV-Exception auf. Die anfälligen
Fix-Umwandlungen (die diesen Fehler scheinbar produzieren können) habe
ich alle überprüft, wo nötig auch eine Sicherheitsabfrage eingefügt.
Diese Exception entsteht irgendwo anders. Sie ist ebenfalls nicht
reproduzierbar.
Die folgende Unzulänglichkeit werde ich vielleicht noch abstellen:
- Die Fehlerabfragen im Parser (der Programmteil in der Tool.Library,
der die Strings auswertet) sind nicht die besten. Es wird zwar
verhindert, daß durch NULL geteilt wird, ebenfalls wird bemerkt, wenn von
einer negativen Zahl die Wurzel oder der Log gebildet werden soll. Wurde
aber eine sinnlose Funktion eingegeben, dann wird das nicht bemerkt und
so weit wie möglich ausgewertet. Wurden Funktionen falsch eingegeben
(sinn statt sin) oder groß geschrieben, dann versucht das Programm, dies
als Zahl zu interpretieren, was natürlich recht sinnlose Ergebnisse
hervorbringt. Sollte irgendwann eine Funktion nicht so gezeichnet werden,
wie man sich das ungefähr vorstellt, dann sollte man überprüfen, ob man
sich irgendwo vertippt hat.
Falls jemand Verbesserungsvorschläge, Fehlerkorrekturen (oder auch neu
entdeckte Fehler) hat (z.B. das irgendeine Ableitung falsch gebildet
wird....ich habe da eigentlich sehr viel überprüft): Meine Addresse
befindet sich im File Plotter.Readme (die Hinweise dort bitte beachten).
Viel Freude mit diesen Programm !!